% TP 4, EJ 1

:- consult('../lib.pl').

% servidor( nombre, fila, criticidad ).

servidor( ps1, fila1, crit1 ).
servidor( ps2, fila1, crit2 ).
servidor( was1, fila2, crit1 ).
servidor( was2, fila2, crit4 ).
servidor( fs_x48, fila2, crit1 ).

cliente( ps1, ps2 ). % ps2 cliente de ps1
cliente( was1, was2 ).
cliente( fs_x48, ps1 ).
cliente( fs_x48, was1 ).

% evento( tipo, server/fila )

ocurrio( corte, Fila, servidor(_,Fila,_), inmediata ).
ocurrio( reboot, Server, servidor(Server,_,_), normal  ).
ocurrio( reboot, Server, servidor(Cliente,_,_), normal  ) :- cliente( Server, Cliente ).
ocurrio( cuelgue, Server, servidor(Server,_,crit1), inmediata  ).
ocurrio( cuelgue, Server, servidor(Server,_,crit2), inmediata  ).
ocurrio( cuelgue, Server, servidor(Server,_,crit3), normal  ).
ocurrio( cuelgue, Server, servidor(Server,_,crit4), normal  ).

atencion( Server, evento(Tipo,AQuien), Urgencia ) :-
	servidor(Server,Fila,Crit),
	ocurrio( Tipo, AQuien, servidor(Server,Fila,Crit), Urgencia ).

atencionNormal( Server, evento(Tipo,AQuien) ) :-
	atencion( Server, evento(Tipo,AQuien), normal ).

atencionInmediata( Server, evento(Tipo,AQuien) ) :-
	atencion( Server, evento(Tipo,AQuien), inmediata ).
	

tests :-
	% Corte de luz
	assertTrue( atencionInmediata(ps1,evento(corte,fila1)) ),
	assertFail( atencionInmediata(ps1,evento(corte,fila2))	),
	assertFail( atencionNormal(ps1,evento(corte,fila1))	),
	assertEq( 
		atencionInmediata(S, evento(corte,fila2)),
		S, [was1,was2,fs_x48]  
	),
	% Reboot
	assertEq( 
		atencionNormal(S, evento(reboot,fs_x48)),
		S, [ps1,was1,fs_x48]  
	),
	% Cuelgue
	assertEq( 
		atencionInmediata(S, evento(cuelgue,ps2)),
		S, [ps2]  
	),
	assertEq( 
		atencionNormal(S, evento(cuelgue,was2)),
		S, [was2]  
	)
	.